Android内存溢出

最近的视频项目遇到了内存泄漏,找问题真是蛋疼的事。
主要就是context没有释放,handler的不合理使用,bitmap没有回收,connection没有close等
首先纪录一下sdk官方写handler的方式

1
2
3
4
5
6
7
8
9
10
11
public abstract class WeakHandler<T> extends Handler {
private WeakReference<T> mOwner;

public WeakHandler(T owner) {
mOwner = new WeakReference<T>(owner);
}

public T getOwner() {
return mOwner.get();
}
}

activity中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public abstract class BaseActivity extends AppCompatActivity {

private final UIActivityHandler uiHandler = new UIActivityHandler(this);

public static class UIActivityHandler extends
WeakHandler<BaseActivity> {

public UIActivityHandler(BaseActivity owner) {
super(owner);
}

public void handleMessage(Message msg) {
BaseActivity owner = getOwner();
if (owner == null) {
return;
}
owner.handleUIMessage(msg);
}
}
protected final void postMessageDelay(int what, Object object,
long delayMillis) {
Message msg = Message.obtain();
msg.what = what;
msg.obj = object;
uiHandler.sendMessageDelayed(msg, delayMillis);
}

protected final void postMessage(int what, Object object) {
Message.obtain(uiHandler, what, object).sendToTarget();
}

public void handleUIMessage(Message msg) {

}
}

最后积累一个内存泄露监测工具,square公司的LeakCanary,square确实开源了些好用的东西。
LeakCanary作为一个简单粗暴的工具,用法也相当简单
在build.gradle中引入LeakCanary

1
2
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3'  
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3'

一个是debug包,一个是release包的,从引入包的结构也能看出端倪
由于LeakCanary是测试整个app的内存泄露情况,所以你需要在你的application中启动它

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.zimo.guo;  

import android.app.Application;

import com.squareup.leakcanary.LeakCanary;

/**
* Created by zimo on 15/8/7.
*/
public class MyApplication extends Application {

@Override
public void onCreate() {
super.onCreate();
LeakCanary.install(this);
}
}

这么有逼格的工具,赶紧来试试吧,要想使你的app的内存泄露灰飞烟灭,try it